// 1.自己的作用域链的上一层继承this
function Person() {
  this.age = 0;

  setTimeout(() => {
    console.log('箭头函数',this)
  }, 40);
  const that = this
  setTimeout(function(){
    console.log('普通函数 保存的this(that)', that)
    console.log('普通函数 的this', this) // 定时器
  }, 40);
}

var p = new Person();
// 2.箭头函数没有自己的this指针，call()、apply() 方法调用，只能传递参数（不能绑定this---译者注），他们的第一个参数会被忽略。（这种现象对于bind方法同样成立---译者注）
const user = {
  _age: 23,
  _getAge: function (age) {
    const getAge = num => num + this._age
    return getAge(age)
  },
  _getAgeCall: function (age) {
    const getAge = num => num + this._age
    const user1 = {
      age: 2
    }
    return getAge.call(user1, age) // call()、apply()、bind()
  },
}
console.log('箭头函数正常调用',user._getAge(1));
console.log('call()', user._getAgeCall(1)); 
// 3.不绑定arguments,使用剩余参数
function foo(n) {
  console.log('arguments', arguments);
  var f = () => arguments[0] + n; // 隐式绑定 foo 函数的 arguments 对象. arguments[0] 是 n,即传给foo函数的第一个参数
  return f();
}

console.log('foo(1)', foo(1)); // 2
console.log('foo(3, 2)', foo(3, 2))//6

function foo1(arg) {
  var f = (...args) => args[0];
  return f(arg);
}
console.log('剩余参数，foo1', foo1(1)); // 1

function foo2(arg1, arg2) {
  var f = (...args) => args[1];
  return f(arg1, arg2);
}
console.log('剩余参数，foo2', foo2(1, 2))  //2
// 4.使用 new 操作符
const functionNew = () => 1
console.log('new一个箭头函数', new functionNew()) // (箭头函数不能用作构造器（自然也没有prototype（undefined)），和 new一起用会抛出错误。)